import java.util.Stack;

/**
 * Created by zhourh on 2018/5/25.
 * 你现在是棒球比赛记录员。
 给定一个字符串列表，每个字符串可以是以下四种类型之一：
 1.整数（一轮的得分）：直接表示您在本轮中获得的积分数。
 2. "+"（一轮的得分）：表示本轮获得的得分是前两轮有效 回合得分的总和。
 3. "D"（一轮的得分）：表示本轮获得的得分是前一轮有效 回合得分的两倍。
 4. "C"（一个操作，这不是一个回合的分数）：表示您获得的最后一个有效 回合的分数是无效的，应该被移除。

 每一轮的操作都是永久性的，可能会对前一轮和后一轮产生影响。
 你需要返回你在所有回合中得分的总和。

 栈
 */
public class BaseballGame {

    public static void main(String[] args) {
        BaseballGame baseballGame = new BaseballGame();
        System.out.println(baseballGame.calPoints(new String[]{"5","2","C","D","+"}));
        System.out.println(baseballGame.calPoints(new String[]{"5","-2","4","C","D","9","+","+"}));
    }
    public int calPoints(String[] ops) {
        if (ops == null || ops.length == 0) {
            return 0;
        }

        Stack<Integer> pointStack = new Stack<>();

        for (String op : ops) {
            switch (op) {
                case "+":
                    Integer topPoint = 0;
                    Integer top2Potion = 0;
                    if (!pointStack.isEmpty()) {
                        topPoint = pointStack.pop();
                    }

                    if (!pointStack.isEmpty()) {
                        top2Potion = pointStack.pop();
                    }

                    if (top2Potion != null) {
                        pointStack.push(top2Potion);
                    }

                    if (topPoint != null) {
                        pointStack.push(topPoint);
                    }

                    if (topPoint + top2Potion != 0) {
                        pointStack.push(topPoint + top2Potion);
                    }

                    break;

                case "D":
                    if (!pointStack.isEmpty()) {
                        pointStack.push(pointStack.peek() * 2);
                    }
                    break;
                case "C":
                    if (!pointStack.isEmpty()) {
                        pointStack.pop();
                    }
                    break;
                default:
                    Integer point = Integer.parseInt(op);
                    if (point != 0) {
                        pointStack.push(point);
                    }
                    break;
            }
        }

        int result = 0;
        for (Integer point : pointStack) {
            result += point;
        }

        return result;
    }
}
